/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package otcapp.controlador;

import java.awt.Component;
import java.beans.PropertyVetoException;
import java.util.HashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.plaf.basic.BasicInternalFrameUI;
import otcapp.controlador.seguridadDecoradores.FabricaContrladores;

/**
 *
 * @author diego
 */
public class ControladorPrincipal implements Controlador {

    private HashMap<Enum, Controlador> controladores;
    private ControladorPrincipalPantalla pantalla;
    private Controlador controladorActual;
//    private static ControladorPrincipal instancia;
//
//    public static ControladorPrincipal getInstancia() {
//        if (instancia == null) {
//            instancia = new ControladorPrincipal();
//        }
//        return instancia;
//    }

    protected ControladorPrincipal() {
        controladores = new HashMap<>();
        pantalla = new ControladorPrincipalPantalla();
        pantalla.setTitle("SISTEMA - OTC");

    }

    @Override
    public JInternalFrame getPantalla() {
        return null;
    }

    public ControladorPrincipalPantalla getPantallaPrincipal() {
        return pantalla;
    }

    /**
     * Enumeración con los nombres de los controladores que tendrá el sistema
     */
    public enum controlador {

        ABM_PERSONAL, ASIGNAR_PROFESIONAL, CONSULTAR_PIEZAS, INGRESAR_PIEZA, MENU_PRINCIPAL, INTERNOS, SUPERVISIONES, PERFILES, USUARIO
    }

    /**
     * Crea un contrlador y lo inicia, si el contolador ya existe, hace visible
     * la pantalla
     *
     * @param nombre
     */
    public Controlador iniciarContrlador(controlador nombre) {

        if (controladorActual != null) {
            controladorActual.getPantalla().setVisible(false);
        }

        Controlador nuevoControlador = null;
        if (controladores.get(nombre) != null) {//El controlador ya ha sido iniciado
            controladores.get(nombre).continuar();
            return controladores.get(nombre);
        }

        switch (nombre) {
            case ABM_PERSONAL:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.ABM_PERSONAL);
                break;
            case ASIGNAR_PROFESIONAL:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.ASIGNAR_PROFESIONAL);
                break;
            case CONSULTAR_PIEZAS:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.CONSULTAR_PIEZAS);
                break;
            case INGRESAR_PIEZA:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.INGRESAR_PIEZA);
                break;
            case INTERNOS:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.INTERNOS);
                break;
            case SUPERVISIONES:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.SUPERVISIONES);
                break;
            case PERFILES:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.PERFILES);
                break;
            case USUARIO:
                nuevoControlador = FabricaContrladores.getInstancia().getControlador(FabricaContrladores.controlador.USUARIO);
                break;

        }
        controladores.put(nombre, nuevoControlador);//agrega el contrlador a la lista
        agregarPantallaInterna(nuevoControlador.getPantalla());

        nuevoControlador.iniciar();
        controladorActual = nuevoControlador;
        return controladorActual;
    }

    public Controlador getControlador(controlador nombre) {
        Controlador contr = controladores.get(nombre);
        if (contr != null) {
            return contr;
        } else {
            return null;
        }
    }

    /**
     * Agrega el Internal Frame al contenedor principa
     *
     * @param pantallaInterna
     */
    protected void agregarPantallaInterna(Component pantallaInterna) {

        pantallaInterna.setBounds(0, 0, pantalla.getWidth(), pantalla.getHeight());
        pantalla.getContenedorPrincipal().add(pantallaInterna);

        try {//hace que el InternalFrame se maximice.
            ((JInternalFrame) pantallaInterna).setMaximum(true);
        } catch (PropertyVetoException ex) {
            Logger.getLogger(ControladorPrincipal.class.getName()).log(Level.SEVERE, null, ex);
        }
        ((BasicInternalFrameUI) ((JInternalFrame) pantallaInterna).getUI()).setNorthPane(null);//esto hace que el internal frame no tenga barra de titulos
    }

    @Override
    public void iniciar() {
        pantalla.setVisible(true);
        pantalla.setExtendedState(JFrame.MAXIMIZED_BOTH);
    }

    @Override
    public void finalizar() {
        System.exit(0);
    }

    @Override
    public void continuar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
